package com.exercise.mvn;

import com.github.cosycode.common.base.FileDisposer;
import com.github.cosycode.common.util.io.FileSystemUtils;
import com.github.cosycode.common.util.otr.PrintTool;
import lombok.Data;
import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.function.Consumer;

/**
 * <b>Description : </b>
 * <p>
 * <b>created in </b> 2022/9/15
 * </p>
 *
 * @author pengfchen
 **/
public class MavenFileCheck {

    static String FILE_DIR_PATH = "/Users/pengfchen/.m2/repository";

    /**
     * 这也就是为什么，明明开启了 offline 离线模式，明明从其他人那里拷贝了相关依赖包到本地，但构建过程却依据需要联网的原因？因为你本地的依赖包里有这些临时文件，表明本地依赖包可能不是完整包，不能直接被使用，需要先进行验证，自然就需要联网了。
     *
     * @param args
     */
    public static void main(String[] args) throws FileNotFoundException {
        File file1 = new File(FILE_DIR_PATH);

        Map<String, String> fileTypeMap = new HashMap<>();

        FileSystemUtils.findFileFromDir(file1, f -> {
            // maven 仓库里面若是有 xxx.repositories 或 xxx.lastUpdated 文件, 依然会远程验证.
            String name = f.getName();
            if (name.endsWith("_remote.repositories")) {
                return true;
            }
//            if (name.endsWith(".lastUpdated") && !name.endsWith(".pom.lastUpdated")) {
//                return true;
//            }
            return false;
        }, true, f -> {
            File parentFile = f.getParentFile();
            File[] files = parentFile.listFiles();
            List<String> fileNames = new ArrayList<>();
            boolean flag = false;
            for (File item : files) {
                fileNames.add(item.getPath());
                if (item.getName().endsWith(".jar")) {
                    flag = true;
                }
            }
            if (!flag) {
                System.out.println();
                System.out.println(parentFile.getPath());
                fileNames.forEach(System.out::println);
            }
        });
    }

    public static void test(File file1) throws FileNotFoundException {
        Map<String, List<File>> listMap = new TreeMap<>();
        FileSystemUtils.fileDisposeByRecursion(file1, f -> {

        }, File::isDirectory);
        FileSystemUtils.findFileFromDir(file1, File::isDirectory, true, f -> {
            File parentFile = f.getParentFile();
            File[] files = parentFile.listFiles();
            List<String> fileNames = new ArrayList<>();
            boolean flag = false;
            for (File item : files) {
                fileNames.add(item.getPath());
                if (item.getName().endsWith(".jar")) {
                    flag = true;
                }
            }
            if (!flag) {
                System.out.println();
                System.out.println(parentFile.getPath());
                fileNames.forEach(System.out::println);
            }
        });
    }


    /**
     * 判断是否是规范文件夹, 一个文件夹里面要么全是文件, 要么全是文件夹
     */
    @Test
    public void test() {
        File file = new File(FILE_DIR_PATH);
        directoryDisposeByRecursion(file, f -> !f.getName().equals(".DS_Store"), fileDirectoryBean -> {
            // 文件夹里面只有文件, 没有文件夹
            if (fileDirectoryBean.hasFile) {
                File dir = fileDirectoryBean.getFile();
                File[] files = dir.listFiles();
                assert files != null;
                // 判断一个文件夹里面文件
                boolean hasJar = false;
                boolean hasRemoteRepo = false;
                boolean hasLastUpdated = false;
                for (File item : files) {
                    String name = item.getName();
                    if (name.equals("_remote.repositories")) {
//                        item.delete();
                        hasRemoteRepo = true;
                    } else if (name.endsWith(".jar")) {
                        hasJar = true;
                    } else if (name.endsWith(".jar.lastUpdated")) {
                        hasLastUpdated = true;
                    } else if (name.endsWith(".jar.md5")) {

                    }
                }
                if (hasRemoteRepo) {
                    for (File item : files) {
                        System.out.println(item.getPath());
                    }
                    System.out.println();
                }
            }
        });
    }

    /**
     * 文件夹递归处理
     * 如果 file 不能通过 fileFilter 过滤条件, 则直接返回.
     * 如果 file 是一个文件, 则执行 fileDisposer 处理方法.
     * 如果 file 是一个文件夹, 则对文件夹中的每个子文件夹和文件递归调用本方法.
     *
     * @param file         文件 或 文件夹.
     * @param fileFilter   文件过滤器.
     */
    public static void directoryDisposeByRecursion(File file, FileFilter fileFilter, Consumer<FileDirectoryBean> consumer) {
        if (file == null || !file.exists()) {
            return;
        }
        // 过滤
        if (fileFilter != null && !fileFilter.accept(file)) {
            return;
        }
        if (file.isDirectory()) {
            FileDirectoryBean fileDirectoryBean = new FileDirectoryBean();
            fileDirectoryBean.setFile(file);
            File[] files = file.listFiles();
            if (files != null) {
                for (File item : files) {
                    if (fileFilter != null && !fileFilter.accept(item)) {
                        continue;
                    }
                    if (item.isFile()) {
                        fileDirectoryBean.setHasFile(true);
                    } else if (item.isDirectory()) {
                        directoryDisposeByRecursion(item, fileFilter, consumer);
                        fileDirectoryBean.setHasDir(true);
                    } else {
                        PrintTool.warn(file.getPath());
                    }
                }
            }
            consumer.accept(fileDirectoryBean);
        }
    }

    @Data
    static class FileDirectoryBean {
        boolean hasFile;
        boolean hasDir;
        File file;
    }

}
